package com.qk.management.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.net.URL;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

@Slf4j
@Component
public class OssPathExtractor {
    
    @Value("${aliyun.oss.bucketName:}")
    private String bucketName;
    
    @Value("${aliyun.oss.endpoint:}")
    private String endpoint;
    
    /**
     * 从头像URL中提取OSS路径
     */
    public String extractOssPathFromUrl(String avatarUrl) {
        if (avatarUrl == null || avatarUrl.trim().isEmpty()) {
            return null;
        }
        
        try {
            // 情况1：完整的OSS URL（带域名）
            if (avatarUrl.contains(endpoint)) {
                return extractFromFullUrl(avatarUrl);
            }
            
            // 情况2：相对路径（只有bucket和key）
            if (avatarUrl.contains(bucketName)) {
                return extractFromRelativePath(avatarUrl);
            }
            
            // 情况3：直接就是OSS key（没有域名和bucket）
            if (isLikelyOssKey(avatarUrl)) {
                return avatarUrl;
            }
            
            // 情况4：其他格式的URL，尝试解析路径部分
            return extractPathFromGenericUrl(avatarUrl);
            
        } catch (Exception e) {
            log.warn("无法从URL中提取OSS路径: {}, 错误: {}", avatarUrl, e.getMessage());
            return null;
        }
    }
    
    /**
     * 从完整的OSS URL中提取路径
     * 示例: <a href="https://bucket-name.region.aliyuncs.com/path/to/image.jpg">...</a> → path/to/image.jpg
     */
    private String extractFromFullUrl(String fullUrl) {
        try {
            URL url = new URL(fullUrl);
            String path = url.getPath();
            
            // 移除开头的斜杠
            if (path.startsWith("/")) {
                path = path.substring(1);
            }
            
            // 如果路径以bucketName开头，移除bucketName部分
            if (path.startsWith(bucketName + "/")) {
                path = path.substring(bucketName.length() + 1);
            }
            
            return URLDecoder.decode(path, StandardCharsets.UTF_8);
        } catch (Exception e) {
            log.warn("解析完整OSS URL失败: {}", fullUrl);
            return null;
        }
    }
    
    /**
     * 从相对路径中提取
     * 示例: bucket-name/path/to/image.jpg → path/to/image.jpg
     */
    private String extractFromRelativePath(String relativePath) {
        if (relativePath.startsWith(bucketName + "/")) {
            return relativePath.substring(bucketName.length() + 1);
        }
        return relativePath;
    }
    
    /**
     * 从通用URL中提取路径
     */
    private String extractPathFromGenericUrl(String genericUrl) {
        try {
            // 如果不是以http/https开头，添加协议头以便解析
            if (!genericUrl.startsWith("http")) {
                genericUrl = "https://" + genericUrl;
            }
            
            URL url = new URL(genericUrl);
            String path = url.getPath();
            
            if (path.startsWith("/")) {
                path = path.substring(1);
            }
            
            return URLDecoder.decode(path, StandardCharsets.UTF_8);
        } catch (Exception e) {
            log.warn("解析通用URL失败: {}", genericUrl);
            return null;
        }
    }
    
    /**
     * 判断字符串是否可能是OSS key
     */
    private boolean isLikelyOssKey(String str) {
        if (str == null || str.trim().isEmpty()) {
            return false;
        }
        
        // OSS key通常不包含协议头，但可能包含路径分隔符
        return !str.startsWith("http") && 
               (str.contains("/") || 
                str.contains(".") && isImageFile(str));
    }
    
    /**
     * 判断是否为图片文件
     */
    private boolean isImageFile(String fileName) {
        if (fileName == null) {
            return false;
        }
        String lowerCaseName = fileName.toLowerCase();
        return lowerCaseName.endsWith(".jpg") || 
               lowerCaseName.endsWith(".jpeg") ||
               lowerCaseName.endsWith(".png") ||
               lowerCaseName.endsWith(".gif") ||
               lowerCaseName.endsWith(".bmp") ||
               lowerCaseName.endsWith(".webp") ||
               lowerCaseName.endsWith(".svg");
    }
}